; Dit programma gaat de ingebouwde PWM module gebruiken. Eerst wordt deze geconfigureerd in 
; SetupPWM. Dit betekend de Frequentie of periode instellen (zie datasheets), de PWM functie 
; kiezen, want deze module kan ook voor andere funties dienen en de startwaarde van de 
; dutycycles instellen. In het hoofdprogramma wordt de ene dutycycle vast ingesteld op 1/3 en
; de andere op 2/3. Het hoofdprogramma bestaat uit een lus die afwisselend PB3 en PB4 hoog zet.

	LIST   P=PIC16F876A
	#include <p16f876A.inc>               ; processor specific definitions

	__CONFIG        _CP_OFF & _DEBUG_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _BODEN_OFF & _HS_OSC


TIMER1	EQU     H'20'   	
TIMER2	EQU     H'21'   

	ORG	0
	GOTO	RESET
	ORG	4
	NOP
		
; *******************************************************
; *******************************************************
RESET		
	CALL	SetupPWM

	BSF	STATUS,RP0	; Bank 1
	BCF	TRISB,3		; Set PB4 as output
	BCF	TRISB,4		; Set PB5 as output
	BCF	STATUS,RP0

	MOVLW	D'85'
	MOVWF	CCPR1L		; set Duty Cycle PWM 1 to 1/3
	MOVLW	D'170'
	MOVWF	CCPR2L		; set Duty Cycle PWM 1 to 2/3

LOOP	BSF	PORTB,3
	BCF	PORTB,4

	CALL	DELAY

	BCF	PORTB,3
	BSF	PORTB,4

	CALL	DELAY

	GOTO	LOOP
	

;	****************************************************
;       *        Setup PWM routine: 			   *
;      	****************************************************
SetupPWM:
	BSF	STATUS,RP0	; reg. Bank 1
	BCF	TRISC,1		; PWM2 Output
	BCF	TRISC,2		; PWM1 Output
	BCF	STATUS,RP0	; reg. Bank 0
	
	BSF	STATUS,RP0	; reg. Bank 0
	MOVLW	H'ff'
	MOVWF	PR2
	BCF	STATUS,RP0	; reg. Bank 0
	MOVLW	D'0'
	MOVWF	CCPR1L		; Set Duty Cycle to 0
	MOVLW	D'0'
	MOVWF	CCPR2L		; Set Duty Cycle to 0		
	MOVLW	B'00000100'
	MOVWF	T2CON	
	MOVLW	B'00001100'
	MOVWF	CCP1CON	
	MOVWF	CCP2CON	
	RETURN

;	****************************************************
;       *        delay  routine: 			   *
;      	****************************************************
DELAY	CLRWDT
	MOVLW   D'255'          ;*
        MOVWF   TIMER1          ;*
DELAY2	MOVLW	D'255'
	MOVWF	TIMER2
	DECFSZ  TIMER2,F        ;*
        GOTO    $-1             ;*
	DECFSZ	TIMER1,F
	GOTO	DELAY2	
	RETLW   0


	END      	; End of source code.
			; By Ronald Van Ham


 
